package com.example.config;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.*;

@RestController
@RequestMapping("/sys/test")
public class test {
    @IsAdmin()
//    @PreAuthorize("hasRole('ROLE_财务经理')")
    @RequestMapping("/login")
    public String show(){
        return "123456";
    }


//    public static String encodeJWT(String key) {
//        // 1. 定义header部分内容
//        Map headerMap = new HashMap();
//        headerMap.put("alg", SignatureAlgorithm.HS256.getValue());
//        headerMap.put("typ", "JWT");
//
//        // 2. 定义payload部分内容
//        Map payloadMap = new HashMap();
//        payloadMap.put("iat", UUID.randomUUID());
//        payloadMap.put("exp", System.currentTimeMillis() + 24 * 60 * 60 * 1000);
//        // 3.生成token
//        String jwtToken = Jwts.builder()
//                .setHeaderParams(headerMap)
//                .setClaims(payloadMap)
//                .signWith(SignatureAlgorithm.HS256, key)
//                .compact(); // 拼接header + payload
//        System.out.println(jwtToken);
//
//        return jwtToken;
//    }

//    public static void decodeJWT(String jwtToken, String key) {
//        try {
//            Claims claims = Jwts.parser()
//                    .setSigningKey(key)
//                    .parseClaimsJws(jwtToken)
//                    .getBody();
//            Object iat = claims.get("iat");
//            Object exp = claims.get("exp");
//
//            System.out.println("sub:" + iat + "\n失效了？" + ((System.currentTimeMillis() - (Long)exp) > 0));
//        } catch (ExpiredJwtException e) {
//            System.out.println("mars酱提醒您：token已过期");
//        }
//    }

    public static void main(String[] args) {
//        String jwtToken = encodeJWT("marsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmars");
//        decodeJWT(jwtToken,"marsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmarsmars");
        // 创建一个HashMap，用于存储JWT的头部信息
        HashMap<String,Object> map = new HashMap<>();

        // 获取当前日期和时间的Calendar实例
        Calendar instance = Calendar.getInstance();

        // 将当前时间增加20秒
        instance.add(Calendar.SECOND,5000);

        // 使用JWT.create()开始构建一个新的JWT
        String token = JWT.create()
                // 使用withHeader方法设置JWT的头部信息，这里传入了之前创建的map，可以不设定，使用默认的头部信息
                .withHeader(map)
                // 使用withClaim方法添加一个名为"userId"的claim，值为20
                .withClaim("userId",20)
                // 使用withClaim方法添加一个名为"username"的claim，值为"zhangsan"
                .withClaim("username","zhangsan")
                // 使用withExpiresAt方法设置JWT的过期时间，使用之前修改过的Calendar实例作为过期时间
                .withExpiresAt(instance.getTime())
                // 使用sign方法对JWT进行签名，使用HMAC256算法和提供的密钥"fdahuifeuw78921"
                .sign(Algorithm.HMAC256("fdahuifeuw78921"));

        //打印生成的JWT字符串
        System.out.println(token);

        try{
            // 使用JWT.require方法创建一个JWTVerifier，用于验证JWT的签名
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("fdahuifeuw78921")).build();

            // 使用jwtVerifier的verify方法验证JWT字符串，并获得DecodedJWT对象
            DecodedJWT decodedJWT = jwtVerifier.verify(token);

            // 使用decodedJWT对象的getClaim方法获取名为"userId"的claim，并将其作为Integer对象
            Integer userId = decodedJWT.getClaim("userId").asInt();

            // 使用decodedJWT对象的getClaim方法获取名为"username"的claim，并将其作为String对象
            String userName = decodedJWT.getClaim("username").asString();

            // 使用decodedJWT对象的getExpiresAt方法获取JWT的过期时间
            Date time = decodedJWT.getExpiresAt();
            // 打印获取到的用户ID、用户名和过期时间
            System.out.println("userId=" + userId + "\nuserName=" + userName + "\ntime=" + time);
        }catch (TokenExpiredException e){
            System.out.println("令牌已过期");
        }


    }
}
